﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez;
using BussinessLogicTecnoPez.Produccion.FaenamientoEnvasado;
using BussinessLogicTecnoPez.Produccion.Clasificacion_e_Incubacion;
using Tecnopez.Globals;
using System.Text;
using System.Transactions;
using BussinessLogicTecnoPez.Produccion.Producto;

public partial class Modules_FaenamientoEnvasado_RegistrarRealizacionPlan : System.Web.UI.Page, IPostBackEventHandler
{
    #region Session y ViewState
    private DetallePlanFaenamientoEnvasado DetallePlan
    {
        get { return Session["detalleRegistroRealizacionPlan"] as DetallePlanFaenamientoEnvasado; }
        set { Session["detalleRegistroRealizacionPlan"] = value; }
    }
    private ProductosPlanFaenamientoEnvasado ProductosPlan
    {
        get { return Session["productosRegistroRealizacionPlan"] as ProductosPlanFaenamientoEnvasado; }
        set { Session["productosRegistroRealizacionPlan"] = value; }
    }
    private void LimpiarSession()
    {
        Session.Remove("detalleRegistroRealizacionPlan");
        Session.Remove("productosRegistroRealizacionPlan");
    }
    #endregion

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            SetMode(PageMode.ListMode);

        TPPBuscarEstanque.ObjType = typeof(Estanque);
        InicializarGrilla();
        InicializarGrillaDetalle();
        InicializarGrillaProductos();

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/tar.png";
        master.Titulo = "Registrar realización de Planes de Faenamiento y Envasado";

        this.cmdAgregarProducto.OnClientClick = "window.open('ProductoObtenido.aspx','Producto Esperado','left=250,top=100,width=600,height=375,status=no,resizable=yes,scrollbars=no'); return false;";

        WriteJs();
    }

    private void WriteJs()
    {
        StringBuilder strScript = new StringBuilder();
        strScript.AppendLine("function LoadAsignacion()");
        strScript.AppendLine("{ " + this.ClientScript.GetPostBackEventReference(this, "Asignacion") + ";}");
        strScript.AppendLine("function LoadProducto()");
        strScript.AppendLine("{ " + this.ClientScript.GetPostBackEventReference(this, "Producto") + ";}");

        this.ClientScript.RegisterClientScriptBlock(this.GetType(), "Asignaciones", strScript.ToString(), true);
    }

    #region Grilla Principal
    private void InicializarGrilla()
    {
        grdPlanes.setupGrid(typeof(PlanDeFaenamientoEnvasado), cargarGrilla, true, true, this.ViewState);
    }
    private void cargarGrilla()
    {
        PlanDeFaenamientoEnvasado.getManager.ClearFilters();
        PlanDeFaenamientoEnvasado.getManager.ClearOrders();
        PlanDeFaenamientoEnvasado.getManager.AddFilter("IdPlanFaenamientoEnvasado", GenericManager<PlanDeFaenamientoEnvasado>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");
        PlanDeFaenamientoEnvasado.getManager.AddFilter("IsTemplate", GenericManager<PlanDeFaenamientoEnvasado>.filterOperator.Equals, false);
        //PlanDeFaenamientoEnvasado.getManager.AddFilter("Estado", GenericManager<PlanDeFaenamientoEnvasado>.filterOperator.Distinct, Convert.ToInt32(System.Enum.Parse(typeof(PlanDeFaenamientoEnvasado.EstadosPlan), PlanDeFaenamientoEnvasado.EstadosPlan.Finalizado.ToString(), true)));

        if (TPPBuscarEstanque.ItemSelected != null)
        {
            Estanque objEstanque = TPPBuscarEstanque.ItemSelected as Estanque;
            PlanDeFaenamientoEnvasado.getManager.AddFilter("Estanque", GenericManager<PlanDeFaenamientoEnvasado>.filterOperator.Equals, objEstanque.idEstanque);
        }

        if (ViewState[grdPlanes.PageDataViewOrderKey] == null)
            PlanDeFaenamientoEnvasado.getManager.AddOrder("IdPlanFaenamientoEnvasado", GenericManager<PlanDeFaenamientoEnvasado>.Order.orderDirection.DESC);
        else
            PlanDeFaenamientoEnvasado.getManager.AddOrder(ViewState[grdPlanes.PageDataViewOrderKey].ToString(), (GenericManager<PlanDeFaenamientoEnvasado>.Order.orderDirection)ViewState[grdPlanes.PageDataViewOrdenDireccionKey]);

        List<PlanDeFaenamientoEnvasado> lista = new List<PlanDeFaenamientoEnvasado>();
        lista = PlanDeFaenamientoEnvasado.getManager.GetFilter();
        grdPlanes.DataSource = lista;
        grdPlanes.DataBind();

        if (lista == null || lista.Count == 0)
        {
            grdPlanes.Visible = false;
            lblPlanesInformation.Visible = true;
        }
        else
        {
            grdPlanes.Visible = true;
            lblPlanesInformation.Visible = false;
        }
    }
    protected void grdPlanes_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (grdPlanes.Rows[0].Cells[0].Text == "&nbsp;")
        {
            return;
        }

        if (e.CommandName == "ver")
        {
            int IdPlan = int.Parse(grdPlanes.DataKeys[System.Convert.ToInt32(e.CommandArgument)].Value.ToString());
            PlanDeFaenamientoEnvasado.getManager.ClearFilters();
            PlanDeFaenamientoEnvasado.getManager.AddFilter("IdPlanFaenamientoEnvasado", GenericManager<PlanDeFaenamientoEnvasado>.filterOperator.Equals, IdPlan);
            PlanDeFaenamientoEnvasado objPlan = PlanDeFaenamientoEnvasado.getManager.GetOne();

            txtCodigo.Text = objPlan.IdPlanFaenamientoEnvasado.ToString();
            txtObservaciones.Text = objPlan.Observaciones;
            txtEstanque.Text = objPlan.Estanque.ToString();

            lblFechaInicio.Text = objPlan.FechaInicio.Value.ToShortDateString();
            lblHoraInicio.Text = objPlan.FechaInicio.Value.ToShortTimeString();
            lblFechaFin.Text = objPlan.FechaFin.Value.ToShortDateString();
            lblHoraFin.Text = objPlan.FechaFin.Value.ToShortTimeString();

            this.DetallePlan = objPlan.DetallePlanFaenamientoEnvasado;
            this.ProductosPlan = objPlan.ProductosPlanFaenamientoEnvasado;

            InicializarGrillaDetalle();
            InicializarGrillaProductos();

            _lblError.Text = "";

            SetMode(PageMode.EditMode);
        }
    }
    #endregion

    #region Modos
    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }
    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        switch (mode)
        {
            case PageMode.ListMode:
                mvABM.ActiveViewIndex = 0;
                LimpiarSession();
                break;
            case PageMode.NewMode:
                mvABM.ActiveViewIndex = 1;
                txtCodigo.ReadOnly = true;
                txtEstanque.ReadOnly = false;
                txtObservaciones.ReadOnly = false;
                grdAsignaciones.Enabled = true;
                grdProductos.Enabled = true;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdAgregarProducto.Enabled = true;
                break;
            case PageMode.EditMode:
                mvABM.ActiveViewIndex = 1;
                txtCodigo.ReadOnly = true;
                txtEstanque.ReadOnly = true;
                txtObservaciones.ReadOnly = false;
                grdAsignaciones.Enabled = true;
                grdProductos.Enabled = true;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdAgregarProducto.Enabled = true;
                break;
            case PageMode.ViewMode:

                mvABM.ActiveViewIndex = 1;
                txtCodigo.ReadOnly = true;
                txtEstanque.ReadOnly = true;
                txtObservaciones.ReadOnly = true;
                grdAsignaciones.Enabled = false;
                grdProductos.Enabled = false;
                cmdAceptar.Visible = false;
                cmdCancelar.Enabled = true;
                cmdAgregarProducto.Enabled = false;
                break;
        }
    }
    #endregion
    private void InicializarGrillaDetalle()
    {
        grdAsignaciones.setupGrid(typeof(ItemDetallePlanFaenamientoEnvasado), CargarGrillaAsignaciones, true, false, this.ViewState);
    }
    private void CargarGrillaAsignaciones()
    {
        if (this.DetallePlan != null && this.DetallePlan.ItemList.Count > 0)
        {
            grdAsignaciones.DataSource = this.DetallePlan.ItemList;

            DateTime datFechaDesde = DateTime.MaxValue;
            DateTime datFechaHasta = DateTime.MinValue;
            foreach (ItemDetallePlanFaenamientoEnvasado objItem in this.DetallePlan.ItemList)
            {
                if (objItem.Asignacion.EjecucionDesde != null && objItem.Asignacion.EjecucionDesde.Value < datFechaDesde)
                    datFechaDesde = objItem.Asignacion.EjecucionDesde.Value;
                if (objItem.Asignacion.EjecucionHasta != null && objItem.Asignacion.EjecucionHasta.Value > datFechaHasta)
                    datFechaHasta = objItem.Asignacion.EjecucionHasta.Value;

                if (datFechaDesde != DateTime.MaxValue)
                {
                    lblFechaInicioReal.Text = datFechaDesde.ToShortDateString();
                    lblHoraInicioReal.Text = datFechaDesde.ToShortTimeString();
                    lblFechaFinReal.Text = datFechaHasta.ToShortDateString();
                    lblHoraFinReal.Text = datFechaHasta.ToShortTimeString();
                }
                else
                {
                    lblFechaInicioReal.Text = "";
                    lblHoraInicioReal.Text = "";
                    lblFechaFinReal.Text = "";
                    lblHoraFinReal.Text = "";
                }
            }
        }
        else
            grdAsignaciones.DataSource = null;
        grdAsignaciones.DataBind();
    }
    private void InicializarGrillaProductos()
    {
        DataControlField[] controlesExtra = new DataControlField[2];
        ButtonField b = new ButtonField();
        b.CommandName = "EditRow";
        b.HeaderText = "Editar";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/lupa.png";
        b.ButtonType = ButtonType.Image;

        controlesExtra[0] = b;

        b = new ButtonField();
        b.CommandName = "DeleteRow";
        b.HeaderText = "Eliminar";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/eliminar.gif";
        b.ButtonType = ButtonType.Image;

        controlesExtra[1] = b;

        grdProductos.setupGrid(typeof(ProductosFaenamiento), CargarGrillaProductos, true, false, this.ViewState, controlesExtra);
    }
    private void CargarGrillaProductos()
    {
        if (this.ProductosPlan == null)
            grdProductos.DataSource = null;
        else
            grdProductos.DataSource = this.ProductosPlan.ItemList;
        grdProductos.DataBind();
    }
    protected void grdAsignaciones_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow && this.DetallePlan != null && this.DetallePlan.ItemList.Count > 0)
        {
            ImageButton objImage = null;
            if (this.DetallePlan == null || this.DetallePlan.ItemList.Count == 0)
            {
                //editar
                objImage = e.Row.Controls[9].Controls[0] as ImageButton;
                if (objImage != null)
                    objImage.OnClientClick = "alert('No se puede editar esta fila.'); return false;";
            }
            else
            {
                //editar
                objImage = e.Row.Controls[9].Controls[0] as ImageButton;
                if (objImage != null)
                {
                    ItemDetallePlanFaenamientoEnvasado objItem = this.DetallePlan.ItemList[e.Row.RowIndex] as ItemDetallePlanFaenamientoEnvasado;
                    if (objItem != null)
                        objImage.OnClientClick = "window.open('EjecucionAsignacion.aspx?id=" + objItem.Asignacion.IdAsignacion.ToString() + "','Asignacion','left=250,top=100,width=600,height=475,status=no,resizable=yes,scrollbars=no'); return false;";
                }
            }
        }
    }
    protected void grdProductos_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            ImageButton objImage = null;
            if (this.ProductosPlan == null || this.ProductosPlan.ItemList.Count == 0)
            {
                //eliminar
                objImage = e.Row.Controls[4].Controls[0] as ImageButton;
                if (objImage != null)
                    objImage.OnClientClick = "alert('No se puede editar esta fila.'); return false;";
                //editar
                objImage = e.Row.Controls[3].Controls[0] as ImageButton;
                if (objImage != null)
                    objImage.OnClientClick = "alert('No se puede eliminar esta fila.'); return false;";
            }
            else
            {
                //eliminar
                objImage = e.Row.Controls[4].Controls[0] as ImageButton;
                if (objImage != null)
                {
                    string strScript = "if (!confirm('Desea eliminar el producto seleccionado?')){return false;}";
                    objImage.OnClientClick = strScript;
                }
                //editar
                objImage = e.Row.Controls[3].Controls[0] as ImageButton;
                if (objImage != null)
                {
                    ProductosFaenamiento objProd = this.ProductosPlan.ItemList[e.Row.RowIndex] as ProductosFaenamiento;
                    string strScript = "window.open('ProductoObtenido.aspx?id=" + objProd.Producto.IdProducto.ToString() + "','Producto Esperado','left=250,top=100,width=600,height=375,status=no,resizable=yes,scrollbars=no'); return false;";
                    objImage.OnClientClick = strScript;
                }
            }
        }
    }
    protected void grdProductos_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "DeleteRow")
        {
            this.ProductosPlan.ItemList.RemoveAt(Convert.ToInt32(e.CommandArgument));
            InicializarGrillaProductos();
        }
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        try
        {
            PlanDeFaenamientoEnvasado objPlan = PlanDeFaenamientoEnvasado.getManager.GetOneByPrimaryKey(txtCodigo.Text);

            if (objPlan == null)
            {
                _lblError.Text = "No se pudo encontrar el plan de faenamiento y envasado.";
                return;
            }

            objPlan.DetallePlanFaenamientoEnvasado = this.DetallePlan;
            objPlan.ProductosPlanFaenamientoEnvasado = this.ProductosPlan;

            if (objPlan.DetallePlanFaenamientoEnvasado == null)
            {
                _lblError.Text = "El plan debe incluir al menos una tarea a realizar.";
                return;
            }

            if (objPlan.ProductosPlanFaenamientoEnvasado == null || objPlan.ProductosPlanFaenamientoEnvasado.ItemList.Count == 0)
            {
                _lblError.Text = "El plan debe contener los productos esperados.";
                return;
            }

            objPlan.Observaciones = txtObservaciones.Text;
            objPlan.SetEstado();

            //estamos en modo edicion
            using (TransactionScope objScope = new TransactionScope())
            {
                foreach (ItemDetallePlanFaenamientoEnvasado objItem in objPlan.DetallePlanFaenamientoEnvasado.ItemList)
                {
                    if (!Asignacion.getManager.Update(objItem.Asignacion))
                        throw Asignacion.getManager.GeneratedException;
                }
                if (objPlan.Estado == Convert.ToInt32(PlanDeFaenamientoEnvasado.EstadosPlan.Finalizado))
                {
                    Clasificacion objClasificacion = new Clasificacion();
                    if (objClasificacion.obtenerUltima(objPlan.Estanque.idEstanque))
                        objPlan.Clasificacion = objClasificacion;
                }
                if (!PlanDeFaenamientoEnvasado.getManager.Update(objPlan))
                {
                    throw PlanDeFaenamientoEnvasado.getManager.GeneratedException;
                }
                if (objPlan.Estado == Convert.ToInt32(PlanDeFaenamientoEnvasado.EstadosPlan.Finalizado))
                {  
                    //quita la cantidad del estanque de faenamiento
                    Clasificacion.retirarPescados(objPlan.Estanque, objPlan.Clasificacion.totalEnEstanque, DateTime.Now);
                    
                    StockProducto objStock;
                    LoteDeFaenamiento objLote;
                    foreach (ProductosFaenamiento objProd in objPlan.ProductosPlanFaenamientoEnvasado.ItemList)
                    {
                        //actualiza stock
                        objStock = StockProducto.incorporarStockDesdePlanFaenamiento(objProd.Producto, objProd.CantidadObtenida, DateTime.Now, objPlan.IdPlanFaenamientoEnvasado);
                        if (!StockProducto.getManager.Insert(objStock))
                            throw StockProducto.getManager.GeneratedException;

                        //crea lotes de faenamiento
                        objLote = new LoteDeFaenamiento();
                        objLote.Fecha = DateTime.Now;
                        objLote.Plan = objPlan;
                        objLote.Codigo = DateTime.Now.ToString("yyyyMMdd") + "_" + objProd.Producto.IdProducto.ToString() + "_" + objPlan.IdPlanFaenamientoEnvasado.ToString();
                        objLote.Producto = objProd.Producto;
                        if (!LoteDeFaenamiento.getManager.Insert(objLote))
                            throw LoteDeFaenamiento.getManager.GeneratedException;
                    }
                    
                }
                objScope.Complete();
            }
            SetMode(PageMode.ListMode);
            InicializarGrilla();
        }
        catch (Exception ex)
        {
            _lblError.Text = "No se pudo realizar la operación. Ocurrió: " + ex.Message;
        }
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.ListMode);
    }

    #region Miembros de IPostBackEventHandler

    public void RaisePostBackEvent(string eventArgument)
    {
        if (eventArgument == "Asignacion")
        {
            InicializarGrillaDetalle();
        }
    }

    #endregion
}